package com.yearno.common.utils

import android.content.Context
import android.os.Environment
import android.util.Log
import java.io.*
import java.text.SimpleDateFormat
import java.util.*

object FileTempLog {
    private const val DEBUG_SWITCH = false // 调试日志开关
    private const val MYLOG_WRITE_TO_FILE = false // 日志写入文件开关
    private const val TAG = "okhttpdns"
    private var logFilePath = ""
    fun d(info: String) {
        if (DEBUG_SWITCH) {
            log(TAG, info, 'd')
        }
    }

    fun i(info: String) {
        log(TAG, info, 'i')
    }

    private const val MYLOG_TYPE = 'v' // 输入日志类型，w代表只输出告警信息等，v代表输出所有信息

    //    private static String MYLOG_PATH_SDCARD_DIR = context.getFilesDir()+"/sdcard/system_config_log/log";// 日志文件在sdcard中的路径
    private const val SDCARD_LOG_FILE_SAVE_DAYS = 0 // sd卡中日志文件的最多保存天数
    private const val MYLOGFILEName = "Log.txt" // 本类输出的日志文件名称
    private val myLogSdf = SimpleDateFormat("MM-dd HH:mm:ss") // 日志的输出格式
    private val logfile = SimpleDateFormat("MM-dd") // 日志文件格式
    fun w(tag: String, msg: Any) { // 警告信息
        log(tag, msg.toString(), 'w')
    }

    fun e(tag: String, msg: Any) { // 错误信息
        log(tag, msg.toString(), 'e')
    }

    fun d(tag: String, msg: Any) { // 调试信息
        log(tag, msg.toString(), 'd')
    }

    fun i(tag: String, msg: Any) { //
        log(tag, msg.toString(), 'i')
    }

    fun v(tag: String, msg: Any) {
        log(tag, msg.toString(), 'v')
    }

    fun w(tag: String, text: String) {
        log(tag, text, 'w')
    }

    fun e(tag: String, text: String) {
        log(tag, text, 'e')
    }

    fun d(tag: String, text: String) {
        log(tag, text, 'd')
    }

    fun i(tag: String, text: String) {
        log(tag, text, 'i')
    }

    fun v(tag: String, text: String) {
        log(tag, text, 'v')
    }

    /**
     * 根据tag, msg和等级，输出日志
     * @param tag
     * @param msg
     * @param level
     */
    private fun log(tag: String, msg: String, level: Char) {
        if ('e' == level && ('e' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) { // 输出错误信息
            Log.e(tag, msg)
        } else if ('w' == level && ('w' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
            Log.w(tag, msg)
        } else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
            Log.d(tag, msg)
        } else if ('i' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
            Log.i(tag, msg)
        } else {
            Log.v(tag, msg)
        }
    }

    private fun log(context: Context, tag: String, msg: String, level: Char) {
        if (MYLOG_WRITE_TO_FILE) //日志写入文件开关
            writeLogtoFile(context, level.toString(), tag, msg)
    }

    private fun getLogFilePath(context: Context?): String {
        val dirPath = Environment.getExternalStorageDirectory()
        var logFilePath = dirPath.path + "/system_trace_log/log" // 日志文件在sdcard中的路径
        if (context != null) {
            logFilePath =
                context.externalCacheDir?.path + "/system_okhttp_log/log" // 日志文件在sdcard中的路径
        }
        return logFilePath
    }

    /**
     * 打开日志文件并写入日志
     * @param mylogtype
     * @param tag
     * @param text
     */
    private fun writeLogtoFile(
        context: Context,
        mylogtype: String,
        tag: String,
        text: String
    ) { // 新建或打开日志文件
        val nowtime = Date()
        val needWriteFiel = logfile.format(nowtime)
        val needWriteMessage =
            myLogSdf.format(nowtime) + "    " + mylogtype + "    " + tag + "    " + text
        val dirsFile = File(getLogFilePath(context))
        if (!dirsFile.exists()) {
            dirsFile.mkdirs()
        }
        //Log.i("创建文件","创建文件");
        val file = File(dirsFile.toString(), needWriteFiel + MYLOGFILEName) // MYLOG_PATH_SDCARD_DIR
        logFilePath = file.path
        if (!file.exists()) {
            try {
                //在指定的文件夹中创建文件
                file.createNewFile()
            } catch (e: Exception) {
            }
        }
        val files = dirsFile.listFiles()
        if (files != null) {
            for (f in files) {
                if (f.name != file.name) { // 判断是否为文件夹
                    try {
                        f.delete()
                    } catch (e: Exception) {
                    }
                }
            }
        }
        try {
            val filerWriter = FileWriter(file, true) // 后面这个参数代表是不是要接上文件中原来的数据，不进行覆盖
            val bufWriter = BufferedWriter(filerWriter)
            bufWriter.write(needWriteMessage)
            bufWriter.newLine()
            bufWriter.close()
            filerWriter.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    /**
     * 删除制定的日志文件
     */
    fun delFile() { // 删除日志文件
        val file = File(logFilePath) // MYLOG_PATH_SDCARD_DIR
        if (file.exists()) {
            file.delete()
        }
    }

    /**
     * 得到现在时间前的几天日期，用来得到需要删除的日志文件名
     */
    private val dateBefore: Date
        private get() {
            val nowtime = Date()
            val now = Calendar.getInstance()
            now.time = nowtime
            now[Calendar.DATE] = now[Calendar.DATE] - SDCARD_LOG_FILE_SAVE_DAYS
            return now.time
        }//java 正则表达式//文件存在//初始化 key值//将读出来的一行行数据使用List存储

    /**
     * 根据行读取内容
     * @return
     */
    internal val logTxt: MutableList<String>
        internal get() {
            //将读出来的一行行数据使用List存储
            val newList = mutableListOf<String>()
            try {
                val file = File(logFilePath)
                var count = 0 //初始化 key值
                if (file.isFile && file.exists()) { //文件存在
                    val isr = InputStreamReader(FileInputStream(file))
                    val br = BufferedReader(isr)
                    var lineTxt: String? = null
                    while (br.readLine().also { lineTxt = it } != null) {
                        if ("" != lineTxt) {
                            val reds = lineTxt!!.split("\\+").toTypedArray()[0] //java 正则表达式
                            newList.add(count, reds)
                            count++
                        }
                    }
                    isr.close()
                    br.close()
                } else {
                    Log.e("tag", "can not find file")
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return newList
        }
}